// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// 用于将用户信息生产JWT字符串
const jwt = require('jsonwebtoken')
// 将JWT字符串解析还原成JSON对象
const expressJwt = require("express-jwt")

const secretKey = 'ac is xiaobai *^*'

// 配置解析JWT字符串的中间件 并挂载到 req.user 属性上 同时unless方法可以控制那些路由是需要权限的 那些是不需要权限的
// express-jwt超过6.0.0版本，需要加algorithms: [""]
app.use(expressJwt({ secret: secretKey, algorithms: ['HS256'] }).unless({ path: [/^\/api\//] }))
// 解析url-encoded
app.use(express.urlencoded({ extended: false }))
// 登录接口
app.post('/api/login', function (req, res) {
    // 将 req.body 请求体中的数据，转存为 userinfo 常量
    const userinfo = req.body
    // 登录失败
    if (userinfo.username !== 'admin' || userinfo.password !== '000000') {
        return res.send({
            status: 400,
            message: '登录失败！',
        })
    }

    // 在登录成功之后，调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端
    // 参数1：用户的信息对象
    // 参数2：加密的秘钥
    // 参数3：配置对象，可以配置当前 token 的有效期
    // 记住：千万不要把密码加密到 token 字符中
    const tokenStr = jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: '30s' })

    res.send({
        status: 200,
        message: '登录成功！',
        token: tokenStr, // 要发送给客户端的 token 字符串
    })
})

app.get('/admin/getinfo', function (req, res) {
    //使用 req.user 获取用户信息，并使用 data 属性将用户信息发送给客户端
    console.log(req.user)
    res.send({
        status: 200,
        message: '获取用户信息成功！',
        data: req.user, // 要发送给客户端的用户信息
    })
})

// 使用全局错误处理中间件，捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {
    // 这次错误是由 token 解析失败导致的
    if (err.name === 'UnauthorizedError') {
        return res.send({
            status: 401,
            message: '无效的token',
        })
    }
    res.send({
        status: 500,
        message: '未知的错误',
    })
})


// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(80, function () {
    console.log('Express server running at http://127.0.0.1')
})